// Injectable 用来标记一个类是可注入的，可以被其他类依赖注入
import { Injectable } from '@nestjs/common'
import { InjectRepository } from '@nestjs/typeorm'
import { User } from './user.entity'
// Repository 用于定义实体（即数据库表）的存储库，提供对数据库的增删改查操作
import { DeleteResult, Repository } from 'typeorm'
import { CreateUserDto } from './create-user.dto'

@Injectable()
export class UserService {
  constructor(
    // InjectRepository 用来注入一个 TypeORM 的 Repository 实例
    @InjectRepository(User)
    private readonly userRepository: Repository<User>
  ) {}

  /**
   * findOneBy 是 typeorm 提供一个根据参数查询 sql 的方法
   * @param id
   * @returns
   */
  findOne(id: number): Promise<User | null> {
    return this.userRepository.findOneBy({ id })
  }

  /**
   * find() 是 typeorm 提供一个查询所有 sql 的方法
   * @returns
   */
  findAll(): Promise<User[]> {
    return this.userRepository.find()
  }

  createUser(createUserDto: CreateUserDto): Promise<User> {
    const { username, password, role, nickname, avatar } = createUserDto
    const user = new User()
    user.username = username
    user.password = password
    user.role = role
    user.nickname = nickname
    user.avatar = avatar
    user.active = 1
    return this.userRepository.save(user)
  }

  /**
   * delete 是 typeorm 提供一个删除 sql 的方法
   * @param id
   * @returns
   */
  deleteUser(id: number): Promise<DeleteResult> {
    return this.userRepository.delete({ id })
  }

  /**
   * 根据 username 查询用户
   * @param username
   * @returns
   */
  findUserByUsername(username: string): Promise<User | null> {
    return this.userRepository.findOneBy({ username })
  }
}
